package ui.gui;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.HashMap;
import java.util.Map;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

import domein.DomeinController;

public class EditPanel extends JPanel implements MouseMotionListener, MouseListener {

	private int zijde=30;
	private String[][] spelbord;
	
	private Image wall, floor, start, exit, no;

	private int selX=0, selY=0, offsetX=0, offsetY=0;
	
	private Map<String, Image> obstakelMap;
	
	public EditPanel() {
		this.obstakelMap = new HashMap<String, Image>();
		
		this.loadImages();
		
		this.addMouseListener(this);
		this.addMouseMotionListener(this);
	}
	
	private void loadImages() {
		String[][] obstakels = DomeinController.getInstance().geefObstakels();
		
		for(String[] obstakel:obstakels) {
			this.obstakelMap.put(obstakel[1], new ImageIcon("assets/textures/" + obstakel[2]).getImage());
		}
		
		this.wall = this.obstakelMap.get("+");
		this.floor = new ImageIcon("assets/textures/SoilSand0056_1_S.jpg").getImage();
		this.start = new ImageIcon("assets/textures/start.png").getImage();
		this.exit = new ImageIcon("assets/textures/exit.png").getImage();
		
		this.no = new ImageIcon("assets/interface/no.png").getImage();
	}
	
	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		
		spelbord = DomeinController.getInstance().geefSpelbord();	
		
		zijde = this.getWidth()/spelbord[0].length<this.getHeight()/spelbord.length?this.getWidth()/(spelbord[0].length+2):this.getHeight()/(spelbord.length+2);
		
		offsetX = (this.getWidth()-(spelbord[0].length+2)*zijde)/2;
		offsetY = (this.getHeight()-(spelbord.length+2)*zijde)/2;
		
		int posX, posY;
		
		for(int x = 0;x<spelbord[0].length + 2;x++) {
			posX = x*zijde + offsetX;
			
			g.drawImage(this.wall, posX, offsetY, zijde, zijde, null);
			
			posY = zijde+spelbord.length * zijde+offsetY;
			g.drawImage(this.wall, posX, posY, zijde, zijde, null);
		}
		
		for(int y = 0;y<spelbord.length;y++) {
			posY = zijde+y*zijde + offsetY;
			g.drawImage(this.wall, offsetX, posY, zijde, zijde, null);
			
			for(int x = 0;x<spelbord[y].length;x++ ) {
				posX = zijde+x*zijde + offsetX;
				
				g.drawImage(this.floor, posX, posY, zijde, zijde, null);
				g.drawImage(this.obstakelMap.get(spelbord[y][x]), posX, posY, zijde, zijde, null);
				
				if(spelbord[y][x].equals("@")) {
					g.drawImage(this.start, posX, posY, zijde, zijde, null);
				}
				else if(spelbord[y][x].equals("P")) {
					g.setColor(Color.RED);
					g.fillRect(posX, posY, zijde, zijde);
				}
				else if(spelbord[y][x].equals("K")) {
					g.setColor(Color.BLUE);
					g.fillRect(posX, posY, zijde, zijde);
				}
				else if(spelbord[y][x].equals("T")) {
					g.setColor(Color.YELLOW);
					g.fillRect(posX, posY, zijde, zijde);
				}
				else if(spelbord[y][x].equals("S")) {
					g.setColor(Color.LIGHT_GRAY);
					g.fillRect(posX, posY, zijde, zijde);
				}
				else if(spelbord[y][x].equals("x")) {
					g.drawImage(this.exit, posX, posY, zijde, zijde, null);
				}
			}
			
			posX = zijde+spelbord[0].length*zijde + offsetX;
			g.drawImage(this.wall, posX, posY, zijde, zijde, null);
		}
		
		if(selX >= 1 && selY >=1 && selX <= spelbord[0].length && selY <= spelbord.length) {
			if(this.isEmpty(selX, selY)) {
				g.setColor(new Color(0, 255, 0, 100));
			}
			else {
				g.setColor(new Color(255, 0, 0, 100));
				
				//g.drawImage(this.no, selX*zijde+offsetX, selY*zijde+offsetY, zijde, zijde, null);
			}
			
			g.fillRect(selX*zijde+offsetX, selY*zijde+offsetY, zijde, zijde);
		}
	}
	
	private boolean isEmpty(int x, int y) {
		boolean empty;
		
		try {
			empty = spelbord[y-1][x-1].equals(" ");				
		}
		catch(ArrayIndexOutOfBoundsException e) {
			empty = false;
		}
		
		return empty;
	}
	
	@Override
	public void mouseDragged(MouseEvent paramMouseEvent) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseMoved(MouseEvent e) {		
		selX = (int)Math.floor((e.getX()-offsetX)/(double)this.zijde);
		selY = (int)Math.floor((e.getY()-offsetY)/(double)this.zijde);
		
		this.repaint();
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		if(e.getButton() == 1) {			
			try {
				DomeinController.getInstance().plaats(selX-1, selY-1);
				
				this.repaint();
			}
			catch(ArrayIndexOutOfBoundsException e1) {
				
			}
				
			this.repaint();
		}
		else if(e.getButton() == 3) {
			try {
				DomeinController.getInstance().verwijder(selX-1, selY-1);
				
				this.repaint();
			}
			catch(ArrayIndexOutOfBoundsException e1) {
				
			}
		}
	}

	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
}
